#pragma once

#include <string>
#include <vector>
#include <memory>

class Character;
typedef std::shared_ptr<Character> CharacterPtr;

class Room;
typedef std::shared_ptr<Room> RoomPtr;

class Command
{
public:
	Command(const std::string &name);
	virtual ~Command();

	void add(const std::string &alias);
	bool hasAlias(const std::string &alias);

	const std::string &getName() const { return name; }

	virtual void execute(const CharacterPtr &character, const RoomPtr &room, const std::vector<std::string> &args) = 0;

protected:
	std::string name;
	std::vector<std::string> aliases;
};
typedef std::shared_ptr<Command> CommandPtr;
